package RTPower;

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
import java.sql.*;
import java.sql.ResultSet;

/**
 * Mysql处理类
 *
 * @author jerry
 */
abstract public class publicsql {

    /**
     * sql的host
     */
    public String host;
    /**
     * sql的端口
     */
    public String port;
    /**
     * sql要使用的类名
     * <br>在子类中声明
     */
    public String classname;
    /**
     * 要链接的数据库名
     */
    public String dataname;
    /**
     * 数据库用户名
     */
    public String user;
    /**
     * 数据库密码
     */
    public String password;
    /**
     * 链接url 子类中赋值
     */
    public String url;

    public Connection conn = null;
    public PreparedStatement pst = null;

    public publicsql() {
        //运行前先配置sql信息
        FormatSqlInfo();

        try {
            Class.forName(classname);//指定连接类型  
            conn = DriverManager.getConnection(url, user, password);//获取连接 

        } catch (SQLException e) {
            RTFile.d_error(e, "链接数据库失败" + url);

        } catch (ClassNotFoundException er) {
            RTFile.d_error(er, "没有类文件" + url);
        } catch (NullPointerException en) {
            RTFile.d_error(en, "空对象" + url);
        }
    }

    /**
     * 开启事务
     */
    public void StartBegin() {

        try {
            if (conn != null) {
                conn.setAutoCommit(false);
            }

        } catch (SQLException ex) {
            RTFile.d_error(ex, "开启事务出错");
        }

    }

    /**
     * 提交事务
     */
    public void Commit() {
        try {
            if (conn != null) {
                conn.commit();
            }
        } catch (SQLException ex) {

            RTFile.d_error(ex, "提交事务出错.");
        }
    }

    /**
     * 回滚事务
     */
    public void RollBack() {
        try {
            if (conn != null) {
                conn.rollback();
            }
        } catch (SQLException ex) {
            RTFile.d_error(ex, "回滚事务出错");
        }
    }

    /**
     * 查询数据
     * <br>最后使用
     * <br>while (ResultSet.next()) {
     * <br>System.err.println(ResultSet.getString("xx_id"));
     *
     * <br>}<br>循环获取数据
     *
     * @param SelectSqlString
     * @return
     */
    public ResultSet Select(String SelectSqlString) {
        ResultSet rs = null;
        try {
            pst = conn.prepareStatement(SelectSqlString); //准备执行语句 
            rs = pst.executeQuery();

        } catch (SQLException ex) {
            RTFile.d_error(ex, "语句查询失败" + SelectSqlString);
        } catch (Exception e) {
            //捕获其他异常
            RTFile.d_error(e, "查询数据出错" + SelectSqlString);
        }

        return rs;
    }

    /**
     * 增加数据
     *
     * @param SqlString
     * @return 返回自动递增的ID
     */
    public int Insert(String SqlString) {
        int key = 0;
        try {
            pst = conn.prepareStatement(SqlString, Statement.RETURN_GENERATED_KEYS);
            pst.executeUpdate();
            ResultSet rsKey = pst.getGeneratedKeys();      //ResultSet 指示键值
            rsKey.next();
            key = rsKey.getInt(1);     //得到第一个键值

        } catch (SQLException ex) {
            RTFile.d_error(ex, "增加数据出错" + SqlString);
        }

        return key;
    }

    /**
     * 删除数据
     *
     * @param SqlString
     * @return
     */
    public int Delete(String SqlString) {
        int back = DB(SqlString);
        return back;
    }

    /**
     * 更新数据
     *
     * @param SqlString
     * @return
     */
    public int Update(String SqlString) {
        int back = DB(SqlString);
        return back;
    }

    /**
     * 最终使用的方法 增删改
     *
     * @param SqlString
     * @return
     */
    private int DB(String SqlString) {
        //默认返回0
        int backrs = 0;
        try {
            //
            pst = conn.prepareStatement(SqlString);
            backrs = pst.executeUpdate();//执行sql语句

        } catch (SQLException ex) {
            RTFile.d_error(ex, "Sql语句错误" + SqlString);
//            Logger.getLogger(Mysql.class.getName()).log(Level.SEVERE, null, ex);
        }
        return backrs;
    }

    /**
     * 关闭sql链接
     */
    public void close() {
        try {
            if (pst != null) {
                this.pst.close();
            }
            if (this.conn != null) {
                this.conn.close();
            }

        } catch (SQLException e) {
            RTFile.d_error(e, "close 错误");
        }
    }

    /**
     * 子类实现的 配置sql信息
     * <br>配置使用的类,链接 用户名和密码 等等的信息
     */
    public abstract void FormatSqlInfo();

}
